package com.zx.web.controller;


import java.util.HashMap;
import java.util.Map;

import com.zx.server.mapper.QydjYptMmService;
import lombok.extern.slf4j.Slf4j;


import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;



/**
 * 云平台密码加密完整性相关
 */

@Slf4j
@RestController
@RequestMapping("/yptmm")
public class QydjYptMmAction {

	@Autowired
	private QydjYptMmService service;

	/**
	 * * 完整性验证
	 * @param plainData
	 * @return
	 */
	@GetMapping("/SM3HMac")
	public Map<String,Object> SM3HMac(String plainData) {
//		log.info("验证数据为："+ plainData);
		Map<String,Object> map = new HashMap<String, Object>();
		String result =  service.SM3HMac(plainData);
		map.put("code", "200");
		map.put("data", result);
		return map;
	}


	/**
	 * 数据加密
	 * @param plainData
	 * @return
	 */
	@GetMapping("/SM4CBCEnc")
	public Map<String,Object> SM4CBCEnc(@RequestParam("plainData") String plainData){
		Map<String,Object> map = new HashMap<String, Object>();
		String result =  service.SM4CBCEnc(plainData);
		map.put("code", "200");
		map.put("data", result);
		return map;
	}


	/**
	 * 数据解密
	 * @param encryptData
	 * @return
	 */
	@GetMapping("/SM4CBCDec")
	public Map<String,Object> SM4CBCDec(@RequestParam String encryptData){
		log.info("参数替换：" + encryptData.replaceAll(" ","+"));
		Map<String,Object> map = new HashMap<String, Object>();
		String result =  service.SM4CBCDec(encryptData.replaceAll(" ","+"));
		map.put("code", "200");
		map.put("data", result);
		return map;
	}



	/**
	 * 获取随机数
	 * 随机数的时效性由服务端进行管理
	 *
	 * @param username 用户名 （来自前端）
	 * @return 随机数
	 */
	@GetMapping("/getRandom")
	public Map<String,Object>  getRandom(String username) {
		Map<String,Object> map = new HashMap<String, Object>();
		Map<String,Object> result =  service.getRandom(username);
		map.put("code", "200");
		map.put("data", result);
		return map;
	}


	/**
	 * 对前端签名的结果进行验签
	 * 随机数不能从前端传回，需要通过用户标识在缓存中获取
	 *
	 * @param username 用户名 （来着前端）
	 * @param signData 签名结果 （来着前端）
	 * @param cert     数据库中用户绑定的证书 （来着数据库） 这里做测试从前端拿的
	 * @return 是否验签通过
	 */
	@GetMapping("/rawVerify")
	public Map<String,Object> rawVerify(String username, String signData, String cert) {
		Map<String,Object> map = new HashMap<String, Object>();
		boolean result =  service.rawVerify(username,signData,cert);
		map.put("code", "200");
		map.put("data", result);
		return map;
	}


//	/**
//	 * 获取验证码
//	 */
//	@RequestMapping("/sendYzm")
//	public void sendYzm(String username){
//		Dmp p=this.getParamsAsDmp();
//		String phone = p.getAsString("phone");
//		String syqx = p.get("syqx")==null?"wjmm":p.getAsString("syqx");//hjf 2022.1.12增加动态模板使用
//		Dmp jsonDmp = new BaseDmp();
//		try {
//			String yzm = createYzm(6);
//			System.out.println("--yzm->>"+yzm);
//			SendMessageTest test = new SendMessageTest();
//			//int code = test.testSendSignleSM("您的云服务平台验证码是:"+yzm
//						//+"，验证码10分钟内有效，非本人操作请忽略本短信。", phone);
//			String result = getAPIResult2(url,phone,yzm,syqx);
//			ObjectMapper mapper = new ObjectMapper();
//			if(!"".equals(result)){
//				//JsonNode node = mapper.readTree(result);
//				//String resinfo = node.get("Boolean")==null?"":node.get("Boolean").toString();
//				String resinfo=result.substring(9,13);
//				System.out.println(resinfo);
//				if(resinfo.equals("true")){
//					jsonDmp.put("success", "1");
//					jsonDmp.put("msg", "发送成功,验证码10分钟之内有效");
//					jsonDmp.put("yzm", yzm);
//					//保存验证码
//					service.saveYzmOrRandom("1",username,"",yzm,"1");
//				}else{
//					jsonDmp.put("success", "0");
//					jsonDmp.put("msg", "发送失败");
//				}
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//			jsonDmp.put("success", "0");
//			jsonDmp.put("msg", "发送失败");
//		}finally{
//			this.writeResponseText(jsonDmp.toJson());
//		}
//	}
//

//	public String createYzm(int len){
//		String yzm = "";
//		for(int i = 0; i < len; i++){
//			yzm += (int) (Math.random() * 10);
//		}
//		return yzm;
//	}
//
//	public String getAPIResult2(String url,String phone,String msg,String syqx){
//
//		CloseableHttpClient httpClient = HttpClients.createDefault();
//
//		//创建一个post对象
//
//		HttpPost post =new HttpPost(url);
//
////		//创建一个Entity。模拟一个表单
////
////		List<NameValuePair>kvList = new ArrayList<>();
////
////		kvList.add(new BasicNameValuePair("username","zhangsan"));
////
////		kvList.add(new BasicNameValuePair("password","123"));
////
//		//包装成一个Entity对象
//		StringBuilder xmlStr = new StringBuilder();
//		xmlStr.append("<body>");
//		xmlStr.append("<phone>");
//		xmlStr.append(phone);
//		xmlStr.append("</phone>");
//		xmlStr.append("<msg>");
//		xmlStr.append(msg);
//		xmlStr.append("</msg>");
//		xmlStr.append("<syqx>");
//		xmlStr.append(syqx);
//		xmlStr.append("</syqx>");
//		xmlStr.append("</body>");
//		//StringEntity entity = new StringEntity(param.toString(), Charset.forName("UTF-8"));// 第二个参数，设置后才会对，内容进行编码
//		StringEntity entity = new StringEntity(xmlStr.toString(), Charset.forName("UTF-8"));
//		//entity.setContentType("application/soap+xml; charset=UTF-8");
//		//entity.setContentEncoding("UTF-8");
//        //String base64Credentials = new String(Base64.encodeBase64(plainCredentials.getBytes()));
//        System.out.println(xmlStr.toString());
//        post.setHeader("Authorization", xmlStr.toString());
//
//        System.out.println("---------发送请求---------------------");
//		//设置请求的内容
//
//		post.setEntity(entity);
//
//		//执行post请求
//
//		CloseableHttpResponse response;
//
//		String string = "";
//
//		try {
//			response = httpClient.execute(post);
//
//			string = EntityUtils.toString(response.getEntity());
//
//			System.out.println(string);
//
//			response.close();
//
//			httpClient.close();
//
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		return string;
//	}
//

	/**
	 * 对前端签名的结果进行验签
	 * @param username
	 * @param signData
	 * @return
	 */
	@GetMapping("/rawVerify2")
	public Map<String,Object> rawVerify2(String username, String signData) {
		Map<String,Object> map = new HashMap<String, Object>();
		boolean result =  service.rawVerify2(username,signData);
		map.put("code", "200");
		map.put("data", result);
		return map;
	}

	/**
	 * 加密账户数据的password和phone 或者用户数据的password
	 *
	 * @param type  1用户信息信息加密  2账户数据加密
	 * @param id 主键id
	 * @param usrname 用户账户
	 * @return
	 */
	@GetMapping("/SM4CBCEncByIdOrUsername")
	public Map<String,Object> SM4CBCEncByIdOrUsername(String type, String id, String usrname){
		if(StringUtils.isBlank(type) || (StringUtils.isBlank(id)&& StringUtils.isBlank(usrname))){
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.SM4CBCEncByIdOrUsername(type,id,usrname);
	}

	/**
	 *    完整性验证，并且保存是否被篡改结果
	 * @param type  1 用户 2 账户 3机构 4.业务数据 5.日志数据
	 * @param id
	 * @param ispl 1为批量
	 * @return
	 */
	@GetMapping("/SM3HMacById")
	public Map<String,Object> SM3HMacById(String type, String id, String ispl){
		if(StringUtils.isBlank(type) || StringUtils.isBlank(id)){
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.SM3HMacById(type,id,ispl);
	}

	/**
	 *  批量加密
	 * @param type  1用户 2账户
	 * @param id 主键id
	 * @return
	 */
	@GetMapping("/SM4CBCEncById")
	public Map<String,Object> SM4CBCEncById(String type, String id){
		if(StringUtils.isBlank(type) || StringUtils.isBlank(id) ) {
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.SM4CBCEncById(type,id);
	}

	/**
	 * 保存随机数，验证码
	 * @param type 1新增 2删除
	 * @param username
	 * @param random
	 * @param yzm
	 * @return
	 */
	@GetMapping("/saveYzmOrRandom")
	public Map<String,Object> saveYzmOrRandom(String type, String username, String random, String yzm, String operate){
		if(StringUtils.isBlank(type) || StringUtils.isBlank(username) || StringUtils.isBlank(operate)){
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.saveYzmOrRandom(type,username,random,yzm,operate);
	}

	/**
	 * 保存对应证书数据信息
	 * @param username
	 * @param certinfo
	 * @return
	 */
	@PostMapping("/saveCertinfo")
	public Map<String,Object> saveCertinfo(String username, String certinfo){
		if(StringUtils.isBlank(username) || StringUtils.isBlank(certinfo)){
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.saveCertinfo(username,certinfo);
	}

	/**
	 * 查询对应验证码或者随机数
	 * @param
	 * @param username
	 * @return
	 */
	@GetMapping("/getYzmOrRandom")
	public Map<String,Object> getYzmOrRandom(String operate, String username){
		if(StringUtils.isBlank(operate) || StringUtils.isBlank(username)){
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.getYzmOrRandom(operate,username);
	}

	/**
	 *    查询是否需要验证码登录或者ukey
	 * @param
	 * @param
	 * @return
	 */
	@GetMapping("/getSfYzmZh")
	public Map<String,Object> getSfYzmZh(String username){
		if(StringUtils.isBlank(username)) {
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("msg", "参数不能为空");
			return map;
		}
		return service.getSfYzmZh(username);
	}


	/**
	 *    查询验证码是否正确
	 * @param
	 * @param
	 * @return
	 */
	@GetMapping("/verifyYzm")
	public Map<String,Object> verifyYzm(String yzm,String username){
		if(StringUtils.isBlank(yzm) || StringUtils.isBlank(username)) {
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("data", "参数不能为空");
			return map;
		}
		return service.verifyYzm(yzm,username);
	}


	/**
	 * 校验数据是否被篡改
	 * @param
	 * @return type 1 用户 2 账户 3机构 4.业务数据 5.日志数据  6.角色关联权限表
	 */
	@GetMapping("/checkSM3HMa")
	public Map<String,Object> checkSM3HMa(String id,String type){
		if(StringUtils.isBlank(id) || StringUtils.isBlank(type)) {
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "500");
			map.put("data", "参数不能为空");
			return map;
		}
		return service.checkSM3HMa(id,type);
	}

}










